package com.zbkj.admin.service;


import cn.hutool.core.lang.Dict;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageInfo;
import com.mybatisflex.core.service.IService;
import com.zbkj.admin.pojo.EbDividendRecordEntity;
import com.zbkj.admin.pojo.EbOrderProductVoucherRecordEntity;
import com.zbkj.admin.pojo.EbShopFlowingWaterEntity;
import net.dreamlu.mica.core.result.R;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;

/**
 * 店铺营业额度(24小时一条) 服务层。
 *
 * @author mybatis-flex-helper automatic generation
 * @since 1.0
 */
public interface EbShopFlowingWaterService extends IService<EbShopFlowingWaterEntity>, BaseService<EbShopFlowingWaterEntity> {

    /**
     * 店铺分红
     *
     * @param isLimitationShop 是否限制商户流水(测试使用)
     * @return 是否分红成功
     */
    R<Boolean> dividend(boolean isLimitationShop, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 计算分红额度
     *
     * @param proportion   增长比例
     * @param targetPeriod 分期期数
     * @param initPrice    首期初始金额
     * @param maxPeriod    最大计算期数
     */
    Dict priceCount(long proportion, int targetPeriod, BigDecimal initPrice, Long maxPeriod);

    /**
     * 计算指定期数分红
     *
     * @param period                 期数
     * @param recordTimes            （期数）的记录那一笔(第1期第2笔)
     * @param isDividend             是否分红(在for循环下为true)正常情况为false
     * @param cycle                  是否循环(在for循环下为false)正常情况为true
     * @param ebDividendRecordEntity 分红原始记录
     * @param data                   订单商品积分数据 (key:商品id value:商品积分)
     */
    void handleDate(Map<Long, BigDecimal> data,Map<String, Object> longDoubleMap, EbDividendRecordEntity ebDividendRecordEntity,
                    Integer recordTimes, Integer period, Boolean isDividend, Boolean cycle);

    /**
     * 统计数据
     *
     * @param predicate 条件
     * @return 数据
     */
    default Map<String, Object> countFlowingWater(LocalDateTime startTime, LocalDateTime endTime) {
        return countFlowingWater(true, startTime, endTime, null, it -> true);
    }

    /**
     * 统计数据
     *
     * @param predicate 条件
     * @return 数据
     */
    default Map<String, Object> countFlowingWater(LocalDateTime startTme, LocalDateTime end,Predicate<EbOrderProductVoucherRecordEntity> predicate) {
        return countFlowingWater(true, startTme, end, null, predicate);
    }

    /**
     * 统计数据
     *
     * @param uidList 用户id集合
     * @return 数据
     */
    default Map<String, Object> countFlowingWater(LocalDateTime startTme, LocalDateTime end, List<Long> uidList) {
        return countFlowingWater(false, startTme, end, uidList, it -> true);
    }

    /**
     * 统计数据
     *
     * @param isToday   是否统计今日数据
     * @param uidList   用户id集合
     * @param predicate 条件
     * @return 数据
     */
    Map<String, Object> countFlowingWater(Boolean isToday, LocalDateTime startTme, LocalDateTime end,
                                          List<Long> uidList, Predicate<EbOrderProductVoucherRecordEntity> predicate);

    /**
     * 数据分页
     *
     * @param page      分页信息
     * @param shopName  店铺名称
     * @param state     分红状态
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 分页数据
     */
    R<PageInfo<EbDividendRecordEntity>> page(Page<EbDividendRecordEntity> page, String shopName, Integer state, LocalDateTime startDate, LocalDateTime endDate);

}